'''
 使用requests+beautifulsoup库爬取金庸先生简介、小说名及链接地址
'''
# 导入requests库
import requests
from bs4 import BeautifulSoup

# 定义一个公用函数使用requests库获取源代码，唯一的参数为url
def getHTML(url):
    try:
        r = requests.get(url)  # 模拟发送HTTP GET请求
        r.encoding = r.apparent_encoding  # 设置response对象编码
        r.raise_for_status()  # 检查是否存在异常，如果有异常则直接跳出
        html = r.text  # 返回文本形式的HTML源代码
        headers = r.headers  # 返回响应头信息
        return html, headers  # 返回html和headers
    except:
        print("error")  # 如果有异常打印错误

#定义一个函数getJinYong，使用soup的find方法，给定选择器来爬取
def getJinYong(html,selector=None):
    soup = BeautifulSoup(html, 'html.parser')
    target = soup.find(selector)
    return target.text

#定义一个函数getJinYong，使用soup的find方法，给定选择器来爬取简介文本内容
def getJinYong1(html,selector=None):
    soup = BeautifulSoup(html, 'html.parser')
    target = soup.p.string
    return target

#定义一个函数getBookURL，使用soup的select方法，给定选择器来爬取
def getBookURL(html,selector=None):
    #定义一个空字典
    book_url = {}
    #解析网页源代码
    soup = BeautifulSoup(html,'html.parser')
    #基于选择器使用select方法返回解析列表结果
    target = soup.select(selector) 
    #爬取列表元素的string属性，然后使用列表生成式存为book列表
    book=[item.string for item in target]
    #爬取列表元素的attrs属性，属性名为href，然后存为url列表
    url=[item.attrs['href'] for item in target]
    #使用zip函数将book列表和url列表中的元素打包，生成字典
    for item,url in zip(book,url):
        book_url[item]='http://www.wuxia.net.cn'+url
    #返回字典结果
    return book_url

if __name__ == '__main__':
    url = 'http://www.wuxia.net.cn/author/jinyong.html'  # 给定目标网页URL地址
    html, headers = getHTML(url)  # 调用函数获取爬取html代码和headers信息
    # print("爬取的金庸先生简介文本为：",getJinYong(html, selector='p'))
    # print("爬取的金庸先生简介文本为：",getJinYong1(html, selector='p'))
    print("爬取金庸小说及链接地址为：",getBookURL(html,selector='.co3 a'))
